package com.lkd.business.handler;

import com.google.common.collect.Maps;
import com.lkd.business.MsgHandler;
import com.lkd.business.MsgHandlerContext;
import com.lkd.emq.Topic;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class MsgHandlerContextImp implements ApplicationContextAware, MsgHandlerContext{
    private ApplicationContext ctx;
    //TODO：string就是定义的主题名称 ，msgHandler就是topic的实现类名称（可以认为是clientId）。
    private Map<String, MsgHandler> handlerMap = Maps.newHashMap();

    //重写setApplicationContext，为了获取上下文中的对象，存放到handlerMap集合中
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ctx = applicationContext;
        //获取上下文中的MsgHandler的Bean对象，获取类对象（clientID），和主题名称
        Map<String,MsgHandler> map = ctx.getBeansOfType(MsgHandler.class);
        map.values().stream().forEach(v->{
            // 获取主题名称
            String topic =  v.getClass().getAnnotation(Topic.class).value();
            //将主题名称和topic的实现类存放到handlerMap集合
            handlerMap.put(topic,v);
        });
    }

    public MsgHandler getMsgHandler(String msgType){
        return handlerMap.get(msgType);
    }
}
